/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#include "../import/head.h"
#include "../data_struct/head.h"
#include "hook.h"
#include "head.h"
#include "mgr.h"

namespace xos_compress
{

    //////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    static xos_container::i_container* container_ptr = 0;
    static xos_common::i_alloc* alloc_ptr = 0;
    static mgr* mgr_ptr = 0;

    //////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    mgr::mgr()
    {
    }

    mgr::~mgr()
    {
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    int mgr::static_init( xos_container::i_container* pContainer, i_compress_mgr** ppv )
    {
        return xos_stl::static_init_module( pContainer, ppv, container_ptr, mgr_ptr );
    }

    xos_container::i_container* mgr::container()
    {
        return container_ptr;
    }

    xos_common::i_alloc* mgr::alloc()
    {
        return alloc_ptr;
    }

    mgr* mgr::get()
    {
        return mgr_ptr;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

	// 
	// create objects
	// 
	int mgr::create( enumObjType enumType, void ** ppv )
	{
		int ret = 0;

		switch( enumType )
		{
        case enumObjType::OBJ_PROTOCOL:
			{
                protocol_impl * p = protocol_impl::get_item_from_pool();
				p->init();
				*ppv = p;
			}
			break;
		case enumObjType::OBJ_BZIP2:
			{
				bzip2_impl * p = bzip2_impl::get_item_from_pool();
				p->init();
				*ppv = p;
			}
			break;
		case enumObjType::OBJ_LZMA:
			{
				lzma_impl * p = lzma_impl::get_item_from_pool();
				p->init();
				*ppv = p;
			}
			break;
		case enumObjType::OBJ_ZLIB:
			{
                zlib_impl * p = zlib_impl::get_item_from_pool();
				p->init();
				*ppv = p;
			}
			break;
        default:
            {
                ret = 1;
            }
            break;
		}

		return ret;
	}

    i_protocol* mgr::protocol()
    {
        protocol_impl* pT = 0;
        xos_stl::init_pool_item( pT );
        return pT;
    }

    i_compress* mgr::bzip2()
    {
        bzip2_impl* pT = 0;
        xos_stl::init_pool_item( pT );
        return pT;
    }

    i_compress* mgr::lzma()
    {
        lzma_impl* pT = 0;
        xos_stl::init_pool_item( pT );
        return pT;
    }

    i_compress* mgr::zlib()
    {
        zlib_impl* pT = 0;
        xos_stl::init_pool_item( pT );
        return pT;
    }

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    int mgr::put_back_to_pool()
    {
        int ret = 0;
        delete this;
        return ret;
    }

    int mgr::init()
    {
        int ret = 0;

        if( 0 == ret )
        {
            alloc_ptr = container()->common()->alloc();
        }

        if( 0 == ret )
        {
            ret = hook::init();
        }

        return ret;
    }

    int mgr::term()
    {
        int ret = 0;
        hook::term();
        xos_stl::release_interface( alloc_ptr );
        return ret;
    }

} // xos_compress
